package com.fingard.dsp.bank.directbank.chinapay04;

import java.util.*;

import com.fingard.constant.Format;
import com.fingard.dsp.bank.directConfig.ActSetItem;
import com.fingard.dsp.bank.directbank.bankInterface.ITransaction;
import com.fingard.dsp.bank.reqrespobj.transaction.Req7515TodayTrans;
import com.fingard.dsp.bank.reqrespobj.transaction.Req7516HisTrans;
import com.fingard.dsp.bank.reqrespobj.transaction.RetAtsTrans;
import com.fingard.dsp.bank.reqrespobj.transaction.detail.RetAtsTransDetail;
import com.fingard.text.StringHelper;

import static com.fingard.dsp.bank.directbank.chinapay04.ChinaPay04Util.Util.convertResultStringToMap;

public class ChinaPay04Transaction extends ChinaPay04Base implements ITransaction {
    @Override
    public RetAtsTrans d_7516_HisTrans(Req7516HisTrans p_req7516) throws Exception {
        //历史明细查询返回ATS的对象
        RetAtsTrans retAts = new RetAtsTrans(p_req7516.reqHeader);
        String tmpRespCode = "";
        String tmpRespInfo = "";
        retAts.writeStart();//写返回ATS的统一头部信息
        try {
            Calendar tmpCalendarFrom = Calendar.getInstance();
            tmpCalendarFrom.setTime(p_req7516.getDateFrom());

            Calendar tmpCalendarTo = Calendar.getInstance();
            tmpCalendarTo.setTime(p_req7516.getDateTo());

            int tmpIntDateFrom = 0;
            int tmpIntDateTo = 0;
            ActSetItem actItem = this.getBankConfig().getActSetItem(p_req7516.actNum, "7516");
            //按自然日循环查询
            while (tmpIntDateFrom <= tmpIntDateTo && tmpRespCode.length() == 0) {
                Calendar tmpClndrStepTo = Calendar.getInstance();
                tmpClndrStepTo.setTime(tmpCalendarFrom.getTime());

                Map<String, String> data = new HashMap<String, String>();

                /***银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改***/
                data.put("version", getBankConfig().getSetValue("version", "5.0.0", "7516"));               //版本号 全渠道默认值
                data.put("encoding", getCharset());             //字符集编码 可以使用UTF-8,GBK两种方式
                data.put("signMethod", "01"); //签名方法
                data.put("txnType", "76");                           //交易类型 76-对账文件下载
                data.put("txnSubType", "01");                        //交易子类型 01-对账文件下载
                data.put("bizType", "000000");                       //业务类型，固定

                /***商户接入参数***/
                data.put("accessType", "0");                         //接入类型，商户接入填0，不需修改
                data.put("merId", actItem.merchantId);                             //商户代码，请替换正式商户号测试，如使用的是自助化平台注册的777开头的商户号，该商户号没有权限测文件下载接口的，请使用测试参数里写的文件下载的商户号和日期测。如需777商户号的真实交易的对账文件，请使用自助化平台下载文件。
                data.put("settleDate", Format.Date6Format.format(tmpCalendarFrom.getTime()).substring(2));                  //清算日期，如果使用正式商户号测试则要修改成自己想要获取对账文件的日期， 测试环境如果使用700000000000001商户号则固定填写0119
                data.put("txnTime", Format.DateTime14Format.format(new Date()));       //订单发送时间，取系统时间，格式为YYYYMMDDhhmmss，必须取当前时间，否则会报txnTime无效
                data.put("fileType", "00");                          //文件类型，一般商户填写00即可

                /**请求参数设置完毕，以下对请求参数进行签名并发送http post请求，接收同步应答报文------------->**/

                StringBuilder errorSb = new StringBuilder();
                data = signWithFilterBlank(p_req7516.actNum, data, errorSb);
                String errorInfo = errorSb.toString();
                if (StringHelper.isNullOrEmpty(errorInfo)) {
                    String[] tmpStrRet = sendToBank(data, bankFront.getUrl("7516"));
                    if (tmpStrRet[0].length() == 0) {
                        Map<String, String> rspData = convertResultStringToMap(tmpStrRet[1]);
                        String fileContentDispaly = "";
                        if (!rspData.isEmpty()) {
                            if (validate(p_req7516.actNum, rspData, errorSb)) {
                                WriteBankLogLn("验证签名成功");
                                String outPutDirectory = getTempFileDirectory();
                                // 交易成功，解析返回报文中的fileContent并落地
                                String zipFilePath = deCodeFileContent(rspData, outPutDirectory);
//对落地的zip文件解压缩并解析
                                List<String> fileList = unzip(zipFilePath, outPutDirectory);
                                for (String file : fileList) {
                                    if (file.indexOf("ZM_") != -1) {
                                        List<Map> ZmDataList = parseZMFile(file);
                                        //1	交易代码 2	代理机构标识码 3	发送机构标识码 4	系统跟踪号 5	交易传输时间 6	帐号 7	交易金额 8	商户类别 9	终端类型 10	查询流水号 11	支付方式（旧） 12	商户订单号 13	支付卡类型 14	原始交易的系统跟踪号 15	原始交易日期时间 16	商户手续费 17	结算金额 18	支付方式 19	集团商户代码 20	交易类型 21	交易子类 22	业务类型 23	帐号类型 24	账单类型 25	账单号码 26	交互方式 27	原交易查询流水号 28	商户代码 29	分账入账方式 30	二级商户代码 31	二级商户简称 32	二级商户分账入账金额 33	清算净额 34	终端号 35	商户自定义域 36	优惠金额 37	发票金额 38	分期付款附加手续费 39	分期付款期数 40	交易介质 41	保留使用

                                        for (Map<Integer, String> ZmDataMap : ZmDataList) {

                                            RetAtsTransDetail tmpRetDetail = new RetAtsTransDetail();
                                            tmpRetDetail.valueDate = Format.Date10Format.format(tmpCalendarFrom.getTime());
                                            tmpRetDetail.tranDate = Format.Date10Format.format(tmpCalendarFrom.getTime());
                                            String tmpTime = ZmDataMap.get(5).substring(4);
                                            tmpRetDetail.tranTime = tmpRetDetail.tranDate + " " + tmpTime.substring(0, 2) + ":" + tmpTime.substring(2, 4) + ":" + tmpTime.substring(4);
                                            tmpRetDetail.recAccNum = ZmDataMap.get(6);
                                            tmpRetDetail.tranAmt = ZmDataMap.get(7);
                                            tmpRetDetail.billType = ZmDataMap.get(8);
                                            tmpRetDetail.billNum = ZmDataMap.get(12);
                                            tmpRetDetail.originator = ZmDataMap.get(10);
                                            tmpRetDetail.payCode = "交易代码:" + ZmDataMap.get(1) + "  代理机构标识码:" + ZmDataMap.get(2) + "  系统跟踪号:" + ZmDataMap.get(4) + "  终端类型:" + ZmDataMap.get(9);
                                            tmpRetDetail.usage = "支付卡类型:" + ZmDataMap.get(13) + "  商户手续费:" + ZmDataMap.get(16) + "  结算金额:" + ZmDataMap.get(17) + "  清算净额:" + ZmDataMap.get(33);
                                            tmpRetDetail.comment = "集团商户代码:" + ZmDataMap.get(19) + "  商户代码:" + ZmDataMap.get(28) + "  终端号:" + ZmDataMap.get(34);
                                        }

                                    }
                                }

                            } else {
                                tmpRespCode = "-1";
                                tmpRespInfo = errorSb.toString();
                                break;
                            }
                        }
                    } else {
                        tmpRespCode = "-1";
                        tmpRespInfo = tmpStrRet[1];
                        break;
                    }

                } else {
                    tmpRespCode = "-1";
                    tmpRespInfo = errorInfo;
                    break;
                }


                tmpCalendarFrom = tmpClndrStepTo;
                tmpCalendarFrom.add(Calendar.DATE, 1);
                tmpIntDateFrom = Integer.parseInt(Format.Date8Format.format(tmpCalendarFrom.getTime()));
                tmpIntDateTo = Integer.parseInt(Format.Date8Format.format(tmpCalendarTo.getTime()));
            }
        } catch (Exception e) {
            tmpRespCode = "-1";
            tmpRespInfo = e.getMessage();
            e.printStackTrace();
        }
        if (tmpRespCode.equals("-1")) {
            retAts = new RetAtsTrans(p_req7516.reqHeader);
            retAts.writeStart();//写返回ATS的统一头部信息
            retAts.writeRespCode(tmpRespCode);
            retAts.writeRespInfo(tmpRespInfo);
        } else if (retAts.getWrittenRdCount() == 0) {
            retAts.writeRespCode("0");
            retAts.writeRespInfo("交易为空");
        }
        retAts.writeEnd();
        return retAts;
    }

    @Override
    public RetAtsTrans d_7515_TodayTrans(Req7515TodayTrans p_req7515) throws Exception {
        return null;
    }
}
